home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / primcuts.zip / Extended Attributes / ReadEA.cpp next >
C/C++ Source or Header  |  1997-01-11  |  4KB  |  181 lines

  1. #define INCL_DOSFILEMGR
  2.  
  3. #include <os2.h>
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7.  
  8.  
  9. void InitGEA(GEA2 *pGEA2, PCSZ pszName);
  10. void AddGEA(GEA2 *pGEA2, PCSZ pszName);
  11. ULONG CalcGEA2ListSize(GEA2LIST *pGEA2List);
  12.  
  13. BOOL GetFEA(PFEA2 pFEA2, PSZ pszEAName, PUSHORT pusEAID);
  14. PSZ  GetFEAString(PFEA2 pFEA2, PSZ pszString);
  15. BOOL GetNextFEA(PFEA2 *ppFEA2, PSZ pszEAName, PUSHORT pusEAID);
  16.  
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.    APIRET   rc = 0;
  21.    char     pchRecord[] = "RT.RECORD";
  22.    char     pchArtist[] = "RT.ARTIST";
  23.    char     pchTitle[] = "RT.TITLE";
  24.    EAOP2    eaop2;
  25.    USHORT   usEaID = 0;
  26.  
  27.    eaop2.fpGEA2List = (GEA2LIST*)new char[500];
  28.    eaop2.fpFEA2List = (FEA2LIST*)new char[65536];
  29.    eaop2.oError = 0;
  30.  
  31.    /* Make EA list */
  32.    InitGEA(eaop2.fpGEA2List->list, (PCSZ)pchRecord);
  33.    AddGEA(eaop2.fpGEA2List->list, (PCSZ)pchArtist);
  34.    AddGEA(eaop2.fpGEA2List->list, (PCSZ)pchTitle);
  35.  
  36.    /* Set the total size of GetEA-list */
  37.    eaop2.fpGEA2List->cbList = CalcGEA2ListSize(eaop2.fpGEA2List);
  38.  
  39.    /* Set maximum size of Fetched-Buffer */
  40.    eaop2.fpFEA2List->cbList = 65536;
  41.  
  42.    /* Get the EA's */
  43.    if((rc = DosQueryPathInfo(argv[1], FIL_QUERYEASFROMLIST, &eaop2, sizeof(eaop2))) != 0)
  44.    {
  45.       printf("DosQueryPathInfo failed with %d\n", rc);
  46.       return 1;
  47.    }
  48.  
  49.    /* Exit if no matching EA's where found */
  50.    if(eaop2.fpFEA2List->list[0].cbValue == 0)
  51.    {
  52.       printf("No requested EA's found in file %s\n", argv[1]);
  53.       return 2;
  54.    }
  55.  
  56.    PSZ      pszTmp = new char[256];
  57.    USHORT   usType;
  58.    PFEA2    pFEA2 = &eaop2.fpFEA2List->list[0];
  59.  
  60.    if(GetFEA(pFEA2, pszTmp, &usType))
  61.    {
  62.       do
  63.       {
  64.          if(usType == EAT_ASCII)
  65.          {
  66.             printf("String EA: '%s'.\n", pszTmp);
  67.             printf("  String: '%s'\n", GetFEAString(pFEA2, pszTmp));
  68.          }
  69.       }while(GetNextFEA(&pFEA2, pszTmp, &usType));
  70.    }
  71.  
  72.  
  73.    delete eaop2.fpFEA2List;
  74.    delete eaop2.fpGEA2List;
  75. }
  76.  
  77.  
  78. void InitGEA(GEA2 *pGEA2, PCSZ pszName)
  79. {
  80.    GEA2 *pTmp = NULL;
  81.  
  82.    pTmp = pGEA2;
  83.  
  84.    pTmp->oNextEntryOffset = 0;
  85.    pTmp->cbName = strlen(pszName);
  86.    strcpy(pTmp->szName, pszName);
  87. }
  88.  
  89. void AddGEA(GEA2 *pGEA2, PCSZ pszName)
  90. {
  91.    GEA2 *pTmp;
  92.  
  93.    pTmp = pGEA2;
  94.  
  95.    while(pTmp->oNextEntryOffset != 0)
  96.       pTmp = (GEA2*)((char*)pTmp + pTmp->oNextEntryOffset);
  97.    pTmp->oNextEntryOffset = (ULONG)(pTmp->cbName + 1 + sizeof(ULONG));
  98.  
  99.    if(pTmp->oNextEntryOffset)
  100.       pTmp->oNextEntryOffset+= 4 - (pTmp->oNextEntryOffset % 4);
  101.  
  102.    pTmp = (GEA2*)((char*)pTmp + pTmp->oNextEntryOffset);
  103.    pTmp->oNextEntryOffset = 0;
  104.    pTmp->cbName = strlen(pszName);
  105.    strcpy(pTmp->szName, pszName);
  106. }
  107.  
  108. ULONG CalcGEA2ListSize(GEA2LIST *pGEA2List)
  109. {
  110.    GEA2  *pTmp;
  111.    ULONG ulSize = 0;
  112.  
  113.    pTmp = pGEA2List->list;
  114.  
  115.    ulSize += sizeof(pGEA2List->cbList);
  116.  
  117.    while(pTmp->oNextEntryOffset != 0)
  118.    {
  119.       ulSize += sizeof(pTmp[0].oNextEntryOffset);
  120.       ulSize += sizeof(pTmp[0].cbName);
  121.       ulSize += pTmp->cbName;
  122.  
  123.       pTmp = (GEA2*)((char*)pTmp + pTmp->oNextEntryOffset);
  124.    }
  125.    ulSize += sizeof(pTmp->oNextEntryOffset);
  126.    ulSize += sizeof(pTmp->cbName);
  127.    ulSize += pTmp->cbName;
  128.  
  129.    if(ulSize % 4)
  130.       ulSize += 4 - (ulSize % 4);
  131.  
  132.    return ulSize;
  133. }
  134.  
  135.  
  136.  
  137. BOOL GetFEA(PFEA2 pFEA2, PSZ pszEAName, PUSHORT pusEAID)
  138. {
  139.    USHORT   usEaID = 0;
  140.  
  141.    strncpy(pszEAName, pFEA2->szName, pFEA2->cbName);
  142.    pszEAName[pFEA2->cbName] = '\0';
  143.  
  144.    /* First word is the EA type ID */
  145.    usEaID = *((unsigned short*)(pFEA2->szName + pFEA2->cbName+1));
  146.  
  147.    *pusEAID = usEaID;
  148.  
  149.    return TRUE;
  150. }
  151.  
  152.  
  153. PSZ GetFEAString(PFEA2 pFEA2, PSZ pszString)
  154. {
  155.    USHORT usLen = 0;
  156.  
  157.    usLen = *((unsigned short*)(pFEA2->szName + pFEA2->cbName + sizeof(USHORT)+1));
  158.  
  159.    strncpy(pszString, (const char*)(pFEA2->szName+pFEA2->cbName+1+(2*sizeof(USHORT))), usLen);
  160.    pszString[usLen] = '\0';
  161.  
  162.    return pszString;
  163. }
  164.  
  165.  
  166. BOOL GetNextFEA(PFEA2 *ppFEA2, PSZ pszEAName, PUSHORT pusEAID)
  167. {
  168.    PFEA2 pFEA2 = *ppFEA2;
  169.  
  170.    if(pFEA2->oNextEntryOffset == 0)
  171.       return FALSE;
  172.  
  173.    pFEA2 = (PFEA2)((char*)pFEA2 + pFEA2->oNextEntryOffset);
  174.  
  175.    GetFEA(pFEA2, pszEAName, pusEAID);
  176.  
  177.    *ppFEA2 = pFEA2;
  178.  
  179.    return TRUE;
  180. }
  181.